Türkçe

TypeScript Arayüzleri ve Türlerine yönelik, farklarını, kullanım alanlarını ve dünya çapında sürdürülebilir ve ölçeklenebilir uygulamalar oluşturmak için en iyi uygulamaları araştıran kapsamlı bir rehber.

TypeScript Arayüz vs Tür: Global Geliştiriciler İçin Bildirim En İyi Uygulamaları

JavaScript'in bir üst kümesi olan TypeScript, dünya çapındaki geliştiricilere statik tipleme yoluyla sağlam ve ölçeklenebilir uygulamalar oluşturma gücü verir. Türleri tanımlamak için kullanılan iki temel yapı Arayüzler (Interfaces) ve Türler (Types)'dır. Benzerlikler paylaşsalar da, inceliklerini ve uygun kullanım durumlarını anlamak, temiz, sürdürülebilir ve verimli kod yazmak için çok önemlidir. Bu kapsamlı rehber, TypeScript Arayüzleri ve Türleri arasındaki farkları derinlemesine inceleyecek ve projelerinizde bunları etkili bir şekilde kullanmak için en iyi uygulamaları araştıracaktır.

TypeScript Arayüzlerini Anlamak

TypeScript'te bir Arayüz (Interface), bir nesne için bir sözleşme tanımlamanın güçlü bir yoludur. Bir nesnenin şeklini ana hatlarıyla belirtir, sahip olması gereken özellikleri, veri türlerini ve isteğe bağlı olarak uygulaması gereken yöntemleri belirtir. Arayüzler öncelikle nesnelerin yapısını tanımlar.

Arayüz Sözdizimi ve Örnek

Bir arayüz tanımlamanın sözdizimi basittir:


interface User {
  id: number;
  name: string;
  email: string;
  isActive: boolean;
}

const user: User = {
  id: 123,
  name: "Alice Smith",
  email: "alice.smith@example.com",
  isActive: true,
};

Bu örnekte, User arayüzü bir kullanıcı nesnesinin yapısını tanımlar. user değişkenine atanan herhangi bir nesne bu yapıya uymak zorundadır; aksi takdirde TypeScript derleyicisi bir hata verir.

Arayüzlerin Temel Özellikleri

Bildirim Birleştirme Örneği


interface Window {
  title: string;
}

interface Window {
  height: number;
  width: number;
}

const myWindow: Window = {
  title: "Uygulamam",
  height: 800,
  width: 600,
};

Burada, Window arayüzü iki kez bildirilmiştir. TypeScript bu bildirimleri birleştirerek etkili bir şekilde title, height ve width özelliklerine sahip bir arayüz oluşturur.

TypeScript Türlerini Keşfetmek

TypeScript'te bir Tür (Type), verinin şeklini tanımlamanın bir yolunu sağlar. Arayüzlerin aksine, türler daha çok yönlüdür ve ilkel türler, birleşimler, kesişimler ve demetler dahil olmak üzere daha geniş bir veri yapısı yelpazesini temsil edebilir.

Tür Sözdizimi ve Örnek

Bir tür takma adı (type alias) tanımlamanın sözdizimi aşağıdaki gibidir:


type Point = {
  x: number;
  y: number;
};

const origin: Point = {
  x: 0,
  y: 0,
};

Bu örnekte, Point türü, x ve y koordinatlarına sahip bir nokta nesnesinin yapısını tanımlar.

Türlerin Temel Özellikleri

Birleşim Türü Örneği


type Result = {
  success: true;
  data: any;
} | {
  success: false;
  error: string;
};

const successResult: Result = {
  success: true,
  data: { message: "İşlem başarılı!" },
};

const errorResult: Result = {
  success: false,
  error: "Bir hata oluştu.",
};

Result türü, ya veri ile başarılı ya da bir hata mesajı ile başarısız olabilen bir birleşim türüdür. Bu, başarılı olabilecek veya başarısız olabilecek işlemlerin sonucunu temsil etmek için kullanışlıdır.

Kesişim Türü Örneği


type Person = {
  name: string;
  age: number;
};


type Employee = {
  employeeId: string;
  department: string;
};

type EmployeePerson = Person & Employee;

const employee: EmployeePerson = {
  name: "Bob Johnson",
  age: 35,
  employeeId: "EMP123",
  department: "Mühendislik",
};

EmployeePerson türü, hem Person hem de Employee özelliklerini birleştiren bir kesişim türüdür. Bu, mevcut türleri birleştirerek yeni türler oluşturmanıza olanak tanır.

Temel Farklılıklar: Arayüz vs Tür

Hem arayüzler hem de türler TypeScript'te veri yapılarını tanımlama amacına hizmet etse de, birini diğerine tercih etmeyi etkileyen temel ayrımlar vardır:

  1. Bildirim Birleştirme: Arayüzler bildirim birleştirmeyi desteklerken, türler desteklemez. Bir tür tanımını birden çok dosya veya modül arasında genişletmeniz gerekiyorsa, genellikle arayüzler tercih edilir.
  2. Birleşim Türleri: Türler birleşim türlerini temsil edebilirken, arayüzler doğrudan birleşimleri tanımlayamaz. Birkaç farklı türden biri olabilen bir tür tanımlamanız gerekiyorsa, bir tür takma adı kullanın.
  3. Kesişim Türleri: Türler, & operatörünü kullanarak kesişim türleri oluşturabilir. Arayüzler diğer arayüzleri genişleterek benzer bir etki yaratabilir, ancak kesişim türleri daha fazla esneklik sunar.
  4. İlkel Türler: Türler doğrudan ilkel türleri (string, number, boolean) temsil edebilirken, arayüzler öncelikle nesne şekillerini tanımlamak için tasarlanmıştır.
  5. Hata Mesajları: Bazı geliştiriciler, özellikle karmaşık tür yapılarıyla uğraşırken arayüzlerin türlere göre biraz daha net hata mesajları sunduğunu düşünmektedir.

En İyi Uygulamalar: Arayüz ve Tür Arasında Seçim Yapmak

Arayüzler ve türler arasında seçim yapmak, projenizin özel gereksinimlerine ve kişisel tercihlerinize bağlıdır. Dikkate alınması gereken bazı genel yönergeler şunlardır:

Pratik Örnekler: Global Uygulama Senaryoları

Arayüzlerin ve türlerin global bir uygulamada nasıl kullanılabileceğini göstermek için bazı pratik örnekleri ele alalım:

1. Kullanıcı Profili Yönetimi (Uluslararasılaştırma)

Birden çok dili destekleyen bir kullanıcı profili yönetim sistemi oluşturduğunuzu varsayalım. Kullanıcı profillerinin yapısını tanımlamak için arayüzleri ve farklı dil kodlarını temsil etmek için türleri kullanabilirsiniz:


interface UserProfile {
  id: number;
  name: string;
  email: string;
  preferredLanguage: LanguageCode;
  address: Address;
}

interface Address {
    street: string;
    city: string;
    country: string;
    postalCode: string;
}

type LanguageCode = "en" | "fr" | "es" | "de" | "zh"; // Örnek dil kodları

const userProfile: UserProfile = {
  id: 1,
  name: "John Doe",
  email: "john.doe@example.com",
  preferredLanguage: "en",
  address: { street: "123 Ana Cad", city: "Herhangi Bir Şehir", country: "ABD", postalCode: "12345" }
};

Burada, UserProfile arayüzü, tercih ettikleri dil de dahil olmak üzere bir kullanıcı profilinin yapısını tanımlar. LanguageCode türü, desteklenen dilleri temsil eden bir birleşim türüdür. Address arayüzü, genel bir global format varsayarak adres formatını tanımlar.

2. Para Birimi Dönüşümü (Küreselleştirme)

Farklı para birimlerini ve döviz kurlarını işlemesi gereken bir para birimi dönüştürme uygulaması düşünün. Para birimi nesnelerinin yapısını tanımlamak için arayüzleri ve para birimi kodlarını temsil etmek için türleri kullanabilirsiniz:


interface Currency {
  code: CurrencyCode;
  name: string;
  symbol: string;
}

interface ExchangeRate {
  baseCurrency: CurrencyCode;
  targetCurrency: CurrencyCode;
  rate: number;
}


type CurrencyCode = "USD" | "EUR" | "GBP" | "JPY" | "CAD"; // Örnek para birimi kodları

const usd: Currency = {
  code: "USD",
  name: "Amerika Birleşik Devletleri Doları",
  symbol: "$",
};

const exchangeRate: ExchangeRate = {
  baseCurrency: "USD",
  targetCurrency: "EUR",
  rate: 0.85,
};

Currency arayüzü, kodu, adı ve sembolü de dahil olmak üzere bir para birimi nesnesinin yapısını tanımlar. CurrencyCode türü, desteklenen para birimi kodlarını temsil eden bir birleşim türüdür. ExchangeRate arayüzü, farklı para birimleri arasındaki dönüşüm oranlarını temsil etmek için kullanılır.

3. Veri Doğrulama (Uluslararası Format)

Farklı ülkelerdeki kullanıcılardan veri girişi alırken, verileri doğru uluslararası formata göre doğrulamak önemlidir. Örneğin, telefon numaraları ülke koduna göre farklı formatlara sahiptir. Varyasyonları temsil etmek için türler kullanılabilir.


type PhoneNumber = {
  countryCode: string;
  number: string;
  isValid: boolean; // Geçerli/geçersiz veriyi temsil etmek için bir boolean ekleyin.
};

interface Contact {
   name: string;
   phoneNumber: PhoneNumber;
   email: string;
}


function validatePhoneNumber(phoneNumber: string, countryCode: string): PhoneNumber {
  // ülke koduna dayalı doğrulama mantığı (örneğin, libphonenumber-js gibi bir kütüphane kullanarak)
  // ... Numarayı doğrulamak için uygulama burada.
  const isValid = true; //yer tutucu

  return { countryCode, number: phoneNumber, isValid };
}

const contact: Contact = {
    name: "Jane Doe",
    phoneNumber: validatePhoneNumber("555-123-4567", "US"), //örnek
    email: "jane.doe@email.com",
};


console.log(contact.phoneNumber.isValid); //doğrulama kontrolü çıktısı.

Sonuç: TypeScript Bildirimlerinde Uzmanlaşmak

TypeScript Arayüzleri ve Türleri, veri yapılarını tanımlamak ve kod kalitesini artırmak için güçlü araçlardır. Farklılıklarını anlamak ve bunları etkili bir şekilde kullanmak, sağlam, sürdürülebilir ve ölçeklenebilir uygulamalar oluşturmak için esastır. Bu rehberde özetlenen en iyi uygulamaları takip ederek, arayüzleri ve türleri ne zaman kullanacağınıza dair bilinçli kararlar verebilir, sonuç olarak TypeScript geliştirme iş akışınızı iyileştirebilir ve projelerinizin başarısına katkıda bulunabilirsiniz.

Arayüzler ve türler arasındaki seçimin genellikle kişisel tercih ve proje gereksinimlerine bağlı bir mesele olduğunu unutmayın. Sizin ve ekibiniz için en iyi olanı bulmak için her iki yaklaşımla da denemeler yapın. TypeScript'in tür sisteminin gücünü benimsemek, şüphesiz daha güvenilir ve sürdürülebilir kodlara yol açacak ve dünya çapındaki geliştiricilere fayda sağlayacaktır.